/**
 * 
 */
package compilador.analizadorSintactico.categoriasSintacticas;

import java.util.ArrayList;

import javax.swing.tree.DefaultMutableTreeNode;

import compilador.analizadorSemantico.tablaSimbolos.TablaSimboloSemantico;
import compilador.interfaces.Sentencia;

/**
 * @author Nolberto Castellanos Rodriguez
 * @author Yurani Alejandra Salamanca Lotero
 *
 * Clase que representa la declaracion de una sentencia mientras
 */
public class SentenciaMientras implements Sentencia{
	
//	-------------------------------------------------------------------------------------------------
//	ATRIBUTOS
//	-------------------------------------------------------------------------------------------------
	
	/**
	 * Atributo que contiene las expresiones condicionales
	 */
	private ExpresionesCondicionales expresionesCondicionales;
	
	/**
	 * Atributo que contiene el bloque de sentencias
	 */
	private BloqueSentencias bloqueSentencias;
	
//	-------------------------------------------------------------------------------------------------
//	CONSTRUCTORES
//	-------------------------------------------------------------------------------------------------
	
	/**
	 * Constructor que permite crear una nueva sentencia mientras
	 * @param expresionesCondicionales. Contiene las expresiones condicionales de la sentencia mientras
	 */
	public SentenciaMientras(ExpresionesCondicionales expresionesCondicionales, BloqueSentencias bloqueSentencias) {
		super();
		this.expresionesCondicionales = expresionesCondicionales;
		this.bloqueSentencias = bloqueSentencias;
	}
	
//	-------------------------------------------------------------------------------------------------
//	METODOS
//	-------------------------------------------------------------------------------------------------	
	
	/**
	 * Metodo que permite agregar hojas al nodo de la clase
	 * @return el nodo de la clase con sus hojas
	 */
	public DefaultMutableTreeNode getArbolVisual(){
		DefaultMutableTreeNode miRaiz =  new  DefaultMutableTreeNode("Sentencia Mientras");
		
		if(expresionesCondicionales != null)
			miRaiz.add(expresionesCondicionales.getArbolVisual());
		
		if(bloqueSentencias != null)
			miRaiz.add(bloqueSentencias.getArbolVisual());
		
		return miRaiz;
	}
	
	/* (non-Javadoc)
	 * @see co.edu.uniquindio.ingesis.analizadorSemantico.interfaces.Sentencia#getJavaCode()
	 */
	@Override
	public String getJavaCode() {
		String retornable = "while (";
		
		if (expresionesCondicionales != null) 
			retornable += expresionesCondicionales.getJavaCode();
		
		retornable += "){\n";
		
		if(bloqueSentencias != null)
			retornable += bloqueSentencias.getJavaCode();
		
		return retornable + "}\n";
	}
	
	/* (non-Javadoc)
	 * @see compilador.interfaces.Sentencia#AnalizarSemantica(compilador.analizadorSemantico.tablaSimbolos.TablaSimboloSemantico, java.util.ArrayList, java.lang.String, java.lang.String)
	 */
	@Override
	public void AnalizarSemantica(TablaSimboloSemantico ts,	ArrayList<SimboloError> errores, String claseActual, String metodoActual) {
		this.expresionesCondicionales.analizarSemantica(ts, errores, claseActual, metodoActual);
		this.bloqueSentencias.AnalizarSemantica(ts, errores, claseActual, metodoActual);
	}
	
//	-------------------------------------------------------------------------------------------------
//	GETTERS & SETTERS
//	-------------------------------------------------------------------------------------------------

	/**
	 * Metodo que nos retorna el valor de expresionesCondicionales
	 * @return  expresionesCondicionales. Valor retornado
	 */
	public ExpresionesCondicionales getExpresionesCondicionales() {
		return expresionesCondicionales;
	}


	/**
	 * Metodo que permite asignar el valor de expresionesCondicionales
	 * @param expresionesCondicionales. Valor a asignar expresionesCondicionales
	 */
	public void setExpresionesCondicionales(ExpresionesCondicionales expresionesCondicionales) {
		this.expresionesCondicionales = expresionesCondicionales;
	}
}
